package cn.oms.oms.service.impl;

import cn.oms.oms.entity.Patient;
import cn.oms.oms.entity.User;
import cn.oms.oms.enums.SexEnum;
import cn.oms.oms.exception.ServiceException;
import cn.oms.oms.mapper.PatientMapper;
import cn.oms.oms.mapper.UserMapper;
import cn.oms.oms.res.PatientRes;
import cn.oms.oms.service.IPatientService;
import cn.oms.oms.utils.AgeTools;
import cn.oms.oms.utils.TimeTool;
import cn.oms.oms.vo.PatientReqVo;
import cn.oms.oms.vo.PatientVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.util.StringUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author AllenChen曾晨
 * @since 2022-04-29
 */
@Service
public class PatientServiceImpl extends ServiceImpl<PatientMapper, Patient> implements IPatientService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private PatientMapper patientMapper;

    //查询所有患者的方法
    @Override
    public PageInfo<Patient> selectPatientList(PatientVo patientVo) {

        // 用户名模糊查询设置
        QueryWrapper<Patient> query = new QueryWrapper<>();
        if (StringUtil.isNotEmpty(patientVo.getPatientName())){
            query.like("patientName",patientVo.getPatientName());
        }

        // 时间参数设置
        if (StringUtil.isNotEmpty(patientVo.getSelectTime())){
            // 获取前端日期
            String date = patientVo.getSelectTime();
            // 05-04-2022
            date = TimeTool.formattingTime(date);

            System.out.println("date = " + date);

            Date simpleDate = new Date();
            try {
                simpleDate = new SimpleDateFormat("yyyy-MM-dd").parse(date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            System.out.println("simpleDate = " + simpleDate);

            //日期格式转换
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(simpleDate);

            // 获取当天开始时间
            calendar.set(Calendar.HOUR_OF_DAY,0);
            calendar.set(Calendar.MINUTE,0);
            calendar.set(Calendar.SECOND,0);
            Date startTime = calendar.getTime();
            System.out.println("startTime = " + startTime);

            String startTimeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(startTime);
            System.out.println("startTimeStr = " + startTimeStr);

            // 获取当天结束时间
            calendar.set(Calendar.HOUR_OF_DAY,23);
            calendar.set(Calendar.MINUTE,59);
            calendar.set(Calendar.SECOND,59);
            Date endTime = calendar.getTime();
            System.out.println("endTime = " + endTime);

            String endTimeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(endTime);
            System.out.println("endTimeStr = " + endTimeStr);

            // 加入条件判断查询语句
            query.ge("createTime",startTimeStr);
            query.le("createTime",endTimeStr);
        }

        query.eq("deleteFlag",0);

        //分页
        PageHelper.startPage(patientVo.getPageNum(),patientVo.getPageSize());

        // 查询列表
        List<Patient> patients = patientMapper.selectList(query);
        System.out.println("patients = " + patients);

        // 时间格式化
        for (Patient patient: patients) {
            // 出生年月格式化
            String date = new SimpleDateFormat("yyyy年MM月").format(patient.getPatientDob());
            patient.setReturnPatientDob(date);
            // 创建时间格式化
            date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(patient.getCreateTime());
            patient.setReturnCreateTime(date);
        }

        System.out.println("patientList = " + patients);

        return new PageInfo<>(patients);
    }

    /**
     * 查询患者详情
     * @param patientVo
     * @return
     */
    @Override
    public PatientRes selectPatientDetail(PatientVo patientVo) {
        // 根据患者ID查询患者
        PatientRes patientRes = new PatientRes();
        QueryWrapper<Patient> query = new QueryWrapper<>();
        query.eq("patientId",patientVo.getPatientId());
        query.eq("deleteFlag",0);
        Patient patient = patientMapper.selectOne(query);
        //拷贝
        BeanUtils.copyProperties(patient,patientRes);

        String date = null;
        // 出生年月格式化
        if (patient.getPatientDob()!=null){
            date = new SimpleDateFormat("dd-MM-yyyy").format(patient.getPatientDob());
            patientRes.setReturnPatientDob(date);
        }
        // 创建时间格式化
        if (patient.getCreateTime()!=null){
            date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(patient.getCreateTime());
            patientRes.setReturnCreateTime(date);
        }

       if (patient.getSex()!=null){
           if (patient.getSex()==0){
               patientRes.setSexName("男");
           }else if (patient.getSex()==1){
               patientRes.setSexName("女");
           }else {
               patientRes.setSexName("未知");
           }
       }

       if (patient.getMaritalStatus()!=null){
           if (patient.getMaritalStatus()==0){
               patientRes.setMaritalStatusName("未婚");
           }else if (patient.getMaritalStatus()==1){
               patientRes.setMaritalStatusName("已婚");
           }else if (patient.getMaritalStatus()==2){
               patientRes.setMaritalStatusName("离偶");
           }else if (patient.getMaritalStatus()==3){
               patientRes.setMaritalStatusName("离婚");
           }else{
               patientRes.setMaritalStatusName("其他");
           }
       }

        System.out.println("patientRes = " + patientRes);

        return patientRes;
    }

    /**
     * 新增患者
     * @param patientReqVo
     * @return
     */
    @Override
    public String addPatient(PatientReqVo patientReqVo) {

        // 根据用户前端传入的ID 查询用户是否存在
        User user = userMapper.findUserByUserId(patientReqVo.getUserId());
        if (user==null){
            throw new ServiceException("用户不存在！！！");
        }

        // 根据用户前端传入的ID 查询患者是否存在
        Patient patient = patientMapper.selectPatientByUserId(patientReqVo.getUserId());
        if (patient!=null){
            throw new ServiceException("用户已绑定患者信息！！！");
        }

        // 将获取出生年月将出生年月转格式
        String dob = TimeTool.formattingTime(patientReqVo.getPatientDob());
        Date dateDob = new Date();
        boolean formatStatus = false;
        try {
            dateDob = new SimpleDateFormat("yyyy-MM-dd").parse(dob);
            formatStatus = true;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        // 判断出生日期转换是否正确
        if (!formatStatus){
            throw new ServiceException("日期格式转换异常");
        }
        // 计算患者年龄
        Integer age = AgeTools.ageCalculator(dateDob);

        if (age<0){
            throw new ServiceException("你的生日超过了现在时间！！！请重新输入！！！");
        }

        Patient p = new Patient();
        BeanUtils.copyProperties(patientReqVo,p);
        p.setPatientId(null);
        p.setPatientDob(dateDob);
        p.setAge(age);
        p.setCreateTime(new Date());
        p.setDeleteFlag(0);

        System.out.println("新增患者信息参数：" + p);
        int status = patientMapper.insert(p);
        if (status==1){
            System.out.println("患者信息新增成功！！！！");
        }else {
            System.out.println("患者信息新增失败！！！！");
            throw new ServiceException("数据库新增异常！！！");
        }

        return "ok";
    }

    /**
     * 修改患者信息
     * @param patientReqVo
     */
    @Override
    public String updatePatient(PatientReqVo patientReqVo) {

        if (patientReqVo.getPatientId()==null){
            throw new ServiceException("参数异常，患者ID不能为空");
        }
        if (patientReqVo.getUserId()==null){
            throw new ServiceException("参数异常，用户名不能为空");
        }
        // 查询患者信息
        Patient patient = patientMapper.selectById(patientReqVo.getPatientId());

        // 修改患者信息
        patient.setPatientName(patientReqVo.getPatientName());

        BeanUtils.copyProperties(patientReqVo,patient);

        // 将获取出生年月将出生年月转格式
        String dob = TimeTool.formattingTime(patientReqVo.getPatientDob());
        Date dateDob = new Date();
        boolean formatStatus = false;
        try {
            dateDob = new SimpleDateFormat("yyyy-MM-dd").parse(dob);
            formatStatus = true;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        // 判断出生日期转换是否正确
        if (!formatStatus){
            throw new ServiceException("日期格式转换异常");
        }
        // 计算患者年龄
        Integer age = AgeTools.ageCalculator(dateDob);

        if (age<0){
            throw new ServiceException("你的生日超过了现在时间！！！请重新输入！！！");
        }
        patient.setAge(age);

        // 执行修改
        int num = patientMapper.updateById(patient);
        if (num!=1){
            throw new ServiceException("数据库异常");
        }
        return "ok";
    }

    /**
     * 删除患者
     * @param id
     * @return
     */
    @Override
    public String deletePatient( Integer id) {

        QueryWrapper<Patient> query = new QueryWrapper<>();

        if (id==null||id==0){
            throw new ServiceException("删除异常，患者不存在");
        }

        query.eq("patientId",id);
        query.eq("deleteFlag",0);
        Patient patient = patientMapper.selectOne(query);
        if (patient==null){
            throw new ServiceException("患者不存在");
        }
        patient.setDeleteFlag(1);
        int num = patientMapper.updateById(patient);

        if (num!=1){
            throw new ServiceException("数据库删除异常");
        }
        return "ok";
    }


}
